<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>3.对象的引用传址</title>
</head>

<body>
  <script>
    // 对象是引用类型，赋值传递的是引用地址
    let hd = { name: "后盾人" };
    let cms = hd; // 此时 cms 复制的是 hd的引用地址
    cms.name = "hdcms"; // c更改cms的值，hd的值也会一起改变
    console.log(hd.name); //hdcms

    // 作为函数参数
    // 值类型： 函数会创建新的值，不会共用同一个内存地址
    function show(a) {
      // 值类型
      a += 100
      console.log(a); //101
    }
    let a = 1;
    show(a);
    console.log(a); //1 值类型的变量传递给函数并不会影响自身，是完全赋值

    // 对象作为函数参数引用传递的是引用地址，不是完全赋值，函数内对对象的改变也会影响原始的对象
    let user = { age: 22 };
    function hd2(user) {
      user.age += 10;
    }
    hd2(user);
    console.log(user.age); //32
    // 对象的比较是对内存地址的比较所以使用 `==` 或 `===` 一样
    hd = {};
    let xj = hd;
    cms = {};
    // 赋值，会copy 内存地址
    console.log(hd == xj); //true
    console.log(hd === xj); //true
    // 内存地址不同，值相同返回也是false
    console.log(hd == cms); //false
    console.log(hd === cms); //false
  </script>
</body>

</html>